#ifndef __TIMER__H__
#define __TIMER__H__

#include <stdint.h>

typedef unsigned long long int resultado_t;
// typedef unsigned long long int uint64_t;
// typedef unsigned int uint32_t;

#include <sys/time.h>

class Timer {
	public:
		Timer();
	
		void comenzar();
		void terminar();
		
		resultado_t getTiempo() const; // micro segundos.
		resultado_t getCiclos() const { return mClockFinal - mClockInicial; }
		resultado_t getOperaciones() const { return mOperaciones; }
		long double getOperacionesLog() const { return mOperacionesLog; }
		long double getMilisegundos() const;
		long double getSegundos() const;
		
		void opSencilla( int a, int b );
		void opComplicada( int a, int b );
		void opRaiz( int n );

	private:
		struct timeval mTiempoInicial, mTiempoFinal;
		uint64_t mClockInicial, mClockFinal;
		uint64_t mOperaciones;
		long double mOperacionesLog;
		
		uint64_t rdtsc();
};

#endif
